import java.util.*;

public class Abierta implements TablaDispersion {

	private Vector<Item>[] diccionario;
	private Dispersion disp;

	@SuppressWarnings("unchecked")
	public Abierta(int tamTabla, Dispersion disp) {
		diccionario = new Vector[tamTabla];
		for (int i = 0; i < diccionario.length; i++)
			diccionario[i] = new Vector<Item>();
		this.disp = disp;
	}

	public int insertar(Item x) {
		int pos = disp.calcular(x.clave(), this.dimension());
		int colisiones = 0;
		while (colisiones < diccionario[pos].size() && !((Item) diccionario[pos].get(colisiones)).igualA(x.clave()))
			colisiones++;
		if (colisiones == diccionario[pos].size())
			diccionario[pos].add(x);
		else
			diccionario[pos].set(colisiones, x);
		return colisiones;
	}

	public Item buscar(String clave) {
		int indice = disp.calcular(clave, this.dimension());
		Item aux = null;
		for (int i = 0; i < diccionario[indice].size(); i++) {
			aux = diccionario[indice].get(i);
			if (aux.clave().matches(clave))
				break;
			else
				aux = null;
		}
		return aux;
	}

	public int dimension() {
		return diccionario.length;
	}

	public String listar() {
		String str = new String();
		str = str + "[";
		for (int i = 0; i < diccionario.length; i++) {
			str += "[";
			if (diccionario[i].size() > 0)
				str += ((Item) diccionario[i].get(0)).clave();
			for (int j = 1; j < diccionario[i].size(); j++) {
				str += ";" + ((Item) diccionario[i].get(j)).clave();
			}
			str += "]";
		}
		return (str + "]");
	}

	public String toString() {
		return ("Abierta con " + disp);
	}
}